﻿/*
 http://www.rjboy.cn
 By sean during 2010.07 - 2010.12;
 
 Demo:
 $(".productshow").Xslider({//.productshow是要移动对象的外框,页面上所有绑定了类.productshow的对象都会有切换效果;
 unitdisplayed:3,//可视的单位个数   必需项;
 numtoMove:1,//要移动的单位个数    必需项;
 viewedSize:120,//可视宽度或高度     不传入则查找要移动对象外层的宽或高度;
 scrollobj:".vscrollobj",//要移动的对象    不传入则查找productshow下的ul;
 unitlen:20,//移动的单位宽或高度      不传入则查找li的尺寸;
 scrollobjSize:$(".vscrollobj").height(),//移动最长宽或高（要移动对象的宽度或高度）   不传入则由li个数乘以unitlen计算;
 dir:"V",//水平移动还是垂直移动       默认H为水平移动，传入V则表示垂直移动（注意是大写字母）;
 loop:"cycle",//循环滚动            不传入则不循环滚动;
 speed:500, //滚动速度      默认为500;
 autoscroll:2000//自动移动间隔时间（毫秒）     不传入则不会自动移动;
 });
 */

        (function ($) {
            $.extend($.easing, {
                easeInSine: function (x, t, b, c, d) {
                    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
                }
            });

            $.fn.Xslider = function (settings) {
                settings = $.extend({}, $.fn.Xslider.sn.defaults, settings);
                this.each(function () {
                    var scrollobj = settings.scrollobj ? $(this).find(settings.scrollobj) : $(this).find("ul"),
                            viewedSize = settings.viewedSize || (settings.dir == "H" ? scrollobj.parent().width() : scrollobj.parent().height()), //length of the wrapper visible;
                            scrollunits = scrollobj.find("li"), //units to move;
                            unitlen = settings.unitlen || (settings.dir == "H" ? scrollunits.eq(0).outerWidth() : scrollunits.eq(0).outerHeight()),
                            unitdisplayed = settings.unitdisplayed, //units num displayed;
                            numtoMove = settings.numtoMove > unitdisplayed ? unitdisplayed : settings.numtoMove,
                            scrollobjSize = settings.scrollobjSize || scrollunits.length * unitlen, //length of the scrollobj;
                            offset = 0, //max width to move;
                            offsetnow = 0, //scrollobj now offset;
                            movelength = unitlen * numtoMove,
                            pos = settings.dir == "H" ? "left" : "top",
                            moving = false, //moving now?;
                            btnright = $(this).find("a.aright"),
                            btnleft = $(this).find("a.aleft");

                    btnright.unbind("click");
                    btnleft.unbind("click");

                    settings.dir == "H" ? scrollobj.css("left", "0px") : scrollobj.css("top", "0px");

                    if (scrollobjSize > viewedSize) {
                        if (settings.loop == "cycle") {
                            btnleft.removeClass("agrayleft");
                            if (scrollunits.length < 2 * numtoMove + unitdisplayed - numtoMove) {
                                scrollobj.find("li").clone().appendTo(scrollobj);
                            }
                        } else {
                            btnleft.addClass("agrayleft");
                            offset = scrollobjSize - viewedSize;
                        }
                        btnright.removeClass("agrayright");
                    } else {
                        btnleft.addClass("agrayleft");
                        btnright.addClass("agrayright");
                    }

                    btnleft.click(function () {
                        if ($(this).is("[class*='agrayleft']")) {
                            return false;
                        }

                        if (!moving) {
                            moving = true;

                            if (settings.loop == "cycle") {
                                scrollobj.find("li:gt(" + (scrollunits.length - numtoMove - 1) + ")").prependTo(scrollobj);
                                scrollobj.css(pos, "-" + movelength + "px");
                                $.fn.Xslider.sn.animate(scrollobj, 0, settings.dir, settings.speed, function () {
                                    moving = false;
                                });
                            } else {
                                offsetnow -= movelength;
                                if (offsetnow > unitlen * unitdisplayed - viewedSize) {
                                    $.fn.Xslider.sn.animate(scrollobj, -offsetnow, settings.dir, settings.speed, function () {
                                        moving = false;
                                    });
                                } else {
                                    $.fn.Xslider.sn.animate(scrollobj, 0, settings.dir, settings.speed, function () {
                                        moving = false;
                                    });
                                    offsetnow = 0;
                                    $(this).addClass("agrayleft");
                                }
                                btnright.removeClass("agrayright");
                            }
                        }

                        return false;
                    });
                    btnright.click(function () {
                        if ($(this).is("[class*='agrayright']")) {
                            return false;
                        }

                        if (!moving) {
                            moving = true;

                            if (settings.loop == "cycle") {
                                var callback = function () {
                                    scrollobj.find("li:lt(" + numtoMove + ")").appendTo(scrollobj);
                                    scrollobj.css(pos, "0px");
                                    moving = false;
                                }
                                $.fn.Xslider.sn.animate(scrollobj, -movelength, settings.dir, settings.speed, callback);
                            } else {
                                offsetnow += movelength;
                                if (offsetnow < offset - (unitlen * unitdisplayed - viewedSize)) {
                                    $.fn.Xslider.sn.animate(scrollobj, -offsetnow, settings.dir, settings.speed, function () {
                                        moving = false;
                                    });
                                } else {
                                    $.fn.Xslider.sn.animate(scrollobj, -offset, settings.dir, settings.speed, function () {
                                        moving = false;
                                    });//滚动到最后一个位置;
                                    offsetnow = offset;
                                    $(this).addClass("agrayright");
                                }
                                btnleft.removeClass("agrayleft");
                            }
                        }

                        return false;
                    });

                    if (settings.autoscroll) {
                        $.fn.Xslider.sn.autoscroll($(this), settings.autoscroll);
                    }
                })
            }

            $.fn.Xslider.sn = {
                defaults: {
                    dir: "H",
                    speed: 500
                },
                animate: function (obj, w, dir, speed, callback) {
                    if (dir == "H") {
                        obj.animate({
                            left: w
                        }, speed, "easeInSine", callback);
                    } else if (dir == "V") {
                        obj.animate({
                            top: w
                        }, speed, "easeInSine", callback);
                    }
                },
                autoscroll: function (obj, time) {
                    var vane = "right";
                    function autoscrolling() {
                        if (vane == "right") {
                            if (!obj.find("a.agrayright").length) {
                                obj.find("a.aright").trigger("click");
                            } else {
                                vane = "left";
                            }
                        }
                        if (vane == "left") {
                            if (!obj.find("a.agrayleft").length) {
                                obj.find("a.aleft").trigger("click");
                            } else {
                                vane = "right";
                            }
                        }
                    }
                    var scrollTimmer = setInterval(autoscrolling, time);
                    obj.hover(function () {
                        clearInterval(scrollTimmer);
                    }, function () {
                        scrollTimmer = setInterval(autoscrolling, time);
                    });
                }
            }
        })(jQuery);